/**
 * @Author suoyue_zhan
 * @Date 2021/1/24 22:16
 * @Description
 */
public class StringEquals {

    /**
     * 源码中可以看到本质上比较的都是对象的引用类型，即 ==
     * 但一些像String之类的重写了equals，使其变成值比较，故常说
     * equals: 比较的是值
     * ==: 比较的是引用类型
     */
    public static void equalsAndEquals(){
        //字符串直接赋值存储在字符串常量池中
        String st1 = "suoyue";
        //赋值前先在常量池中查找是否有已存在的字符串，存在则直接引用来赋值（类似于缓存）
        String st2 = "suoyue";
        String st3 = st2+"_zhan";
        String st4 = "suoyue"+"_zhan";
        String st5 = "suoyue_zhan";

        //new创建的字符串对象存储在堆中
        String st6 = new String("suoyue_zhan");

        System.out.println("st1: "+st1+"\tst2: "+st2+"\tst3: "+st3+"\tst4: "+st4+"\tst5: "+st5+"\tst6: "+st6);

        System.out.println("st1.equals(st2): "+st1.equals(st2));
        System.out.println("st1==st2: "+(st1==st2));

        System.out.println("st3.equals(st5): "+st3.equals(st5));
        //难点-注意
        System.out.println("st3==st5: "+(st3==st5));
        System.out.println("st4.equals(st5): "+st4.equals(st5));
        //"suoyue"+"_zhan"在编译器就转换为"suoyue_zhan"，存放在常量区
        System.out.println("st4==st5: "+(st4==st5));

        //值相同，但引用不同
        System.out.println("st5.equals(st6): "+st5.equals(st6));
        System.out.println("st5==st6: "+(st5==st6));
    }


    public static void main(String[] args) {
        equalsAndEquals();
    }

}
